#pragma once

#include <bits/stdc++.h>
#include <tuple>
#include <type_traits>

/**
 * @brief lambda的捕获方式
 *  1). []         不捕获任何变量
 *  2). [&]        按引用捕获外部所有变量
 *  3). [=]        按值捕获外部所有变量
 *  4). [=, &foo]  按值捕获所有变量并按引用捕获foo
 *  5). [bar]      仅仅按值捕获bar, 其余不捕获
 *  6). [this]     捕获当前类中的this指针
 */
class A {
public:
    int _i = 0;
    void func(int x, int y) {
        // auto x1 = []  { return _i; };                 // Error: 未捕获任何内容
        auto x2 = [=] { return _i + x + y;};             // 按值捕获所有外部变量
        auto x3 = [&] { return _i + x + y;};             // 按引用捕获所有外部变量
        auto x4 = [this] { return _i; };                 // 捕获了当前对象
        // auto x5 = [this] { return _i + x + y; };      // Error: 没有捕获x, y
        auto x6 = [this, x ,y] { return _i + x + y; };   // OK
        auto x7 = [this]       { return _i++; };         // OK
     } 
};

/**
 * @brief 测试C++11新标准中的lambda表达式
 * @return int 0 if success else other
 * @code {.cxx}
 *       [capture] (params) opt -> ret { // body code here; }
 *    lambda表达式的返回类型是通过返回值类型后置方式来定义的
 * @endcode
 * 
 */
int lambda_capture(void);


/**
 * @brief  测试C++11新标准中的std::tuple
 * @return int  0 if success else other
 */
int std_tuple(void);